package com.ftg.learn.chapter06;

import java.util.Arrays;

/**
 * 动态数组：可变长数组
 * <p>
 * 底层：数组
 * 初始长度：10
 * 扩容： 1.5*len
 * 最大长度：2的31-1
 * <p>
 * <p>
 * 面向对象： 结果
 * 函数式： function abc(){}
 * 面向对象：细节
 * <p>
 * <p>
 * 数据结构：线性存储结构 [数组|动态数组]
 * 连续|线性 元素在尾页添加
 * <p>
 * 良好封装：所有不想让别人使用的方法/属性  全private
 *
 * @author lijiaxin
 * @version 1.0
 * @date 2023/7/13 8:16
 */

public class DynamicArray {

    /**
     * 成员变量
     */
    private int init_capacity = 10;
    private int max_capacity = Integer.MAX_VALUE;
    private int[] bottom_array;
    /**
     * 索引用来存储数组元素时的下标
     */
    private int index = 0;

    /**
     * 成员方法
     * 构造方法：与类名相同的方法，不能有返回值  什么时候执行，当有人new时
     */

    public DynamicArray() {
        bottom_array = new int[init_capacity];
    }

    /**
     * 用来完成把obj放到数组bottom_array里面的操作
     *
     * @param obj
     * @return
     */
    public boolean add(int obj) {
        computerNewLength();
        bottom_array[index++] = obj;
        return true;
    }

    /**
     * 计算底层数组最后的扩展长度
     *
     * @return
     */
    private void computerNewLength() {
//        int lastCapacity=0;
        long newCapacity = bottom_array.length + (bottom_array.length >> 1);
        int lastCapacity = newCapacity > max_capacity ? max_capacity : (int) newCapacity;
        if (index == bottom_array.length) {
            bottom_array = Arrays.copyOf(bottom_array, lastCapacity);
        }
    }

    /**
     * 表示当前动态数组里面有多少个整数
     *
     * @return
     */
    public int size() {
        return index;
    }

    /**
     * 通过下表来获取元素内容
     *
     * @param index
     * @return
     */
    public int get(int index) {
        return bottom_array[index];
    }

    /**
     * 删除功能
     *
     * @param start
     * @return
     */
    public boolean delete(int start) {
        if (start >= index) {
            return false;
        }
        if (start == index - 1) {
            index--;
            return true;
        }
        for (int i = start; i < bottom_array.length - 1; i++) {
            bottom_array[i] = bottom_array[i + 1];
        }
        index--;
        return true;

//       后一位元素向前移动
//       如果删除最后一位元素，直接index
//        不是最后一个
//        1.向前移动
//        2.产生新数组
//        3.index--
//        return true;

    }

    public static void main(String[] args) {
//        int[] as = {1, 1, 1, 1, 2, 3, 4, 5, 56, 12, 12, 3, 3, 3, 5, 56, 56, 67, 67, 7, 4, 23, 45, 67, 7, 78};
        DynamicArray d = new DynamicArray();
//        for (int i = 0; i < as.length; i++) {
//            if (as[i] % 2 == 0) {
//                d.add(as[i]);
//            }
//        }
//        System.out.println(d.get(d.index));
////        引用类型
////        DynamicArray d = new DynamicArray();
//        System.out.println(d.size());
//        for (int i = 0; i < 10; i++) {
//            d.add(i + 1);
//        }
//        System.out.println(d.size());

        d.add(1);
        d.add(1);
        d.add(1);
        d.add(1);
        d.delete(1);
        for (int i = 0; i < d.size(); i++) {
            System.out.println(d.get(i));
        }
    }
}
